package com.spring.boot.proxy;

/**
 * 代理模式
 * 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时，
 * 访问对象不适合或者不能直接引用目标对象，代理对象作为访问对象和目标对象之间的中介
 *
 * 代理模式的主要优点有：
 * 代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用；
 * 代理对象可以扩展目标对象的功能；
 * 代理模式能将客户端与目标对象分离，在一定程度上降低了系统的耦合度；
 *
 * 其主要缺点是：
 * 在客户端和目标对象之间增加一个代理对象，会造成请求处理速度变慢；
 * 增加了系统的复杂度
 * 个人理解:用一个类去继承一个抽象类或接口,要调用接口时用此类去做代理实现接口中方法,也可在调用前做一些操作.
 */
public class ProxyTest {

    public static void main(String[] args) {

        Proxy proxy =new Proxy();
        proxy.Request();
    }

}

//抽象主题
 interface Subject {
    void Request();
}

//真实主题
class RealSubject implements Subject {
    public void Request() {
        System.out.println("访问真实主题方法...");
    }
}

//代理
class Proxy implements Subject{

    private RealSubject realSubject;

    public void Request() {
        if (realSubject == null){
            realSubject = new RealSubject();
        }
        preRequest();
        realSubject.Request();
        postRequest();
    }

    public void preRequest() {
        System.out.println("访问真实主题之前的预处理。");
    }
    public void postRequest() {
        System.out.println("访问真实主题之后的后续处理。");
    }

}
